feat(disk-hygiene): catalog scope, ownership investigation and cross-target answer reuse - #5630
Conversation
…ets by identity A record with source human whose identity and descendant set still hold now matches the same entry when another scan target reaches it, so the answer is annotated and not asked again. The scan target itself gets target_prior_disposition. Engine records stay per target and path. A changed identity or descendant set still invalidates the answer, and preview and apply still do not read the catalog. Refs #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…scope entries The catalog command now names the entries a catalog must account for: every immediate child, every hinted or genuinely empty entry at any depth, and at a user-home or root-children target every loose unprotected unhinted root entry. Any in-scope entry with no record and no owner-level ancestor is listed under uncatalogued, so nothing that looks out of place is skipped. A finding or answer with an owner and owner_level covers its whole subtree, one record per owning tool instead of one per file. Refs #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ence-gated research escalation Refs #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bump disk-hygiene to 0.41.0 above main's 0.40.0 and keep both changelog entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
PR body contract — issue linkage This PR body conforms to the issue-linkage contract. Nothing to do. |
- The catalog report lists an entry matched to an operator answer recorded under another scan target as one `unchanged` line, `answered under <target>`, so it no longer drops out of every list. - The ownership procedure names the record field `provenance` and puts each evidence item's source into the finding's `evidence` list, which is what the catalog reads. - `/discovery:explore` is used only when it resolves, with a fallback to the local sources. Refs #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…en question An engine record with an open question under the scanned target hid a source: human answer recorded under another target for the same identity and descendant set, so the question was asked again and the entry annotated prior_unresolved. sync_catalog and annotate_entries now let a holding operator answer from another target replace a local record that still has a question; a local record without one still decides. Rename the report key and heading uncatalogued to uncataloged so the typos gate passes, take SKILL.md back under the 500-line cap, and rephrase the %APPDATA% path in ownership-investigation.md so the shell-portability gate does not read it as a GNU-only construct. Refs: #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve the disk-hygiene plugin.json and CHANGELOG conflicts: keep the 0.41.0 to 0.41.2 entries from main and release this branch as 0.42.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @kyle-sexton's task in 3m 57s —— View job Review complete ✅
Ran the Two findings posted as inline review comments:
Both are plausible-but-unverified-by-execution: I traced them through the code and existing tests rather than running a failing repro script. Author-claimed verification in the PR body ( Branch: |
|
Claude finished @kyle-sexton's task in 2m 37s —— View job Security review —
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 01ff8c4284
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Newest operator answer supersedes older ones for the same entry under other targets, reused owner-level answers cover descendants, the home target match uses filesystem identity, sizes-only snapshots are refused, and identity values must be scalars. Refs: #4008 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @kyle-sexton's task in 2m 48s —— View job Code review (
|
|
Claude finished @kyle-sexton's task in 1m 13s —— View job Security review —
|
Refs: #4008
Summary
Completes the remaining unmet parts of the disk-hygiene investigated catalog after slice 1 (#5544): catalog scope with an
uncatalogedreport and owner-level markers, cross-target reuse of operator answers by identity, and the required local ownership investigation with presence-gated/discovery:researchescalation.Fix
investigated_catalog.py:catalog_scope(immediate children, hinted or empty at any depth, out-of-place at a home or--root-childrentarget),owner_levelrecords covering descendants while identity holds,uncatalogedin the report,source: humananswers reused across scan targets by identity.hygiene.py catalog: passes the positional flag; scan stdout and the engine grammar/guard are unchanged.reference/ownership-investigation.mdandSKILL.md: required per-entry procedure with nine enumerated local sources, conclusion inprovenanceand each evidence source in the finding'sevidencelist, research only when no owner is found and only when present, one closing question per unknown owner (stayskeep).Verification
Acceptance criteria (all in
plugins/disk-hygiene/skills/clean/):test_record_carries_the_issue_shape,test_catalog_writes_both_files_and_scan_annotates.prior_disposition, changes first, one line for unchanged:test_prior_disposition_requires_the_same_identity,test_rendered_markdown_leads_with_changes_and_ends_with_questions,test_an_answer_reused_from_another_target_is_reported_unchanged(an entry answered under another scan target gets oneunchangedline,answered under <target>).test_identity_or_descendant_change_invalidates.test_catalogued_remove_does_not_bypass_preview_approval_or_revalidation.CatalogScopeTest(test_scope_names_each_entry_shape,test_an_owner_level_record_covers_its_descendants,test_a_home_target_marks_loose_root_entries_out_of_place).reference/ownership-investigation.md,SKILL.md:267.reference/ownership-investigation.md:45, with/discovery:exploregated the same way.source: human, not re-asked:test_unanswered_unknown_owner_stays_keep_and_is_asked,test_human_keep_answer_is_not_reasked_while_identity_holds,test_operator_answer_is_reused_by_identity_from_another_target,test_an_open_question_yields_to_an_answer_from_another_target(a record here that still has an open question yields to an answer recorded under another target),test_an_open_question_stays_when_no_other_target_has_an_answer.keep:test_unanswered_unknown_owner_stays_keep_and_is_asked.scripts/affected-tests.sh --run: NOT fully met. It selected 293 shell suites and ran all of them sequentially (no OOM this time). 290 pass; 3 fail for host reasons unrelated to this diff:scripts/check-html-assets.test.shandscripts/check-script-contract.test.sh(htmlhint absent from node_modules in the worktree),scripts/hook-census.test.sh(strace missing). Of the 18 selected Python suites run individually, all disk-hygiene ones pass;test_save_point.py(nopytest) andtest_overlap.py(host inventory degraded) fail for host reasons.python3 -m unittest discover -s plugins/disk-hygiene/skills/clean/scripts -p 'test_*.py': 840 tests OK.Remaining: a green
affected-tests.sh --runon a host with htmlhint and strace (CI covers this).Related
🤖 Generated with Claude Code